#! /usr/bin/make

ifdef DEBUG
	DEBUGFLAG = -g -Wall
else
	DEBUGFLAG =
endif

FLAGS=-Iinclude -Llib -std=c++0x ${DEBUGFLAG}

all: bin/TPGrupo16 bin/TPGrupo16rle libs tests

bin/TPGrupo16: src/main.cpp lib/mtf.o lib/mtfAlt.o lib/bs.o lib/RLE.o lib/bitstream.o lib/libestructurado.a lib/libaritmetico.a
	$(CXX) ${FLAGS} src/main.cpp lib/mtf.o lib/mtfAlt.o lib/bs.o lib/RLE.o lib/bitstream.o -lestructurado -laritmetico -o $@

bin/TPGrupo16rle: src/main-rle.cpp lib/mtf.o lib/mtfAlt.o lib/bs.o lib/RLE.o
	$(CXX) ${FLAGS} src/main-rle.cpp lib/mtf.o lib/mtfAlt.o lib/bs.o lib/RLE.o -o $@

tests: bin/count bin/mtf.test bin/bs.test bin/testArit bin/simuladorME bin/TestEstructurado bin/TestDescEstr

libs: lib/mtf.o lib/mtfAlt.o lib/bs.o lib/RLE.o lib/bitstream.o lib/libaritmetico.a lib/libestructurado.a

bin/count: src/count.c
	$(CC) ${DEBUGFLAG} $? -o $@

bin/mtf.test: src/mtf.test.cpp lib/mtf.o lib/mtfAlt.o
	$(CXX) ${FLAGS} src/mtf.test.cpp lib/mtf.o lib/mtfAlt.o -o $@

bin/bs.test: src/bs.test.cpp lib/bs.o
	$(CXX) ${FLAGS} src/bs.test.cpp lib/bs.o -o $@

bin/testArit: src/testArit.cpp lib/libaritmetico.a lib/bitstream.o
	$(CXX) ${FLAGS} src/testArit.cpp -laritmetico lib/bitstream.o -o $@

bin/simuladorME: src/simuladorME.cpp lib/libaritmetico.a lib/bitstream.o
	$(CXX) ${FLAGS} src/simuladorME.cpp -laritmetico lib/bitstream.o -o $@

bin/TestEstructurado: src/TestEstructurado.cpp lib/libestructurado.a lib/libaritmetico.a lib/bitstream.o lib/mtf.o lib/bs.o
	$(CXX) ${FLAGS} src/TestEstructurado.cpp -lestructurado -laritmetico lib/bitstream.o lib/mtf.o lib/bs.o -o $@

bin/TestDescEstr: src/TestDescEstr.cpp lib/libestructurado.a lib/libaritmetico.a lib/bitstream.o
	$(CXX) ${FLAGS} src/TestDescEstr.cpp -lestructurado -laritmetico lib/bitstream.o -o $@

lib/libaritmetico.a: lib/Aritmetico.o lib/Compresor.o lib/Descompresor.o
	ar -cvq $@ lib/Aritmetico.o lib/Compresor.o lib/Descompresor.o

lib/libestructurado.a: lib/Estructurado.o lib/CompresorEstructurado.o lib/DescompresorEstructurado.o lib/Nivel.o
	ar -cvq $@ lib/Estructurado.o lib/CompresorEstructurado.o lib/DescompresorEstructurado.o lib/Nivel.o

lib/mtf.o: src/mtf.cpp include/mtf
	$(CXX) ${FLAGS} src/mtf.cpp -c -o $@

lib/mtfAlt.o: src/mtfAlt.cpp include/mtfAlt
	$(CXX) ${FLAGS} src/mtfAlt.cpp -c -o $@

lib/bs.o: src/bs.cpp include/bs
	$(CXX) ${FLAGS} src/bs.cpp -c -o $@

lib/RLE.o: src/RLE.cpp include/RLE
	$(CXX) ${FLAGS} src/RLE.cpp -c -o $@

lib/bitstream.o: src/bitstream.cpp include/bitstream
	$(CXX) ${FLAGS} src/bitstream.cpp -c -o $@

lib/Aritmetico.o: src/Aritmetico.cpp include/Aritmetico
	$(CXX) ${FLAGS} src/Aritmetico.cpp -c -o $@

lib/Compresor.o: src/Compresor.cpp include/Compresor
	$(CXX) ${FLAGS} src/Compresor.cpp -c -o $@

lib/Descompresor.o: src/Descompresor.cpp include/Descompresor
	$(CXX) ${FLAGS} src/Descompresor.cpp -c -o $@

lib/Nivel.o: src/Nivel.cpp include/Nivel
	$(CXX) ${FLAGS} src/Nivel.cpp -c -o $@

lib/Estructurado.o: src/Estructurado.cpp include/Estructurado
	$(CXX) ${FLAGS} src/Estructurado.cpp -c -o $@

lib/CompresorEstructurado.o: src/CompresorEstructurado.cpp include/CompresorEstructurado
	$(CXX) ${FLAGS} src/CompresorEstructurado.cpp -c -o $@

lib/DescompresorEstructurado.o: src/DescompresorEstructurado.cpp include/DescompresorEstructurado
	$(CXX) ${FLAGS} src/DescompresorEstructurado.cpp -c -o $@

clean:
	rm -f lib/* bin/*

.PHONY: makefile clean

